home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / alpha.arc / PCGEN.ASM < prev    next >
Assembly Source File  |  1988-04-26  |  7KB  |  333 lines

  1.     include lmacros.h
  2.     assume    ds:dataseg
  3.     public sssave,spsave,intstk,doret,isat_
  4.  
  5. ; common routine for interrupt return
  6.  
  7. doret    proc    far
  8.     cmp    isat_,1
  9.     jnz    notat        ; Only one 8259, so skip this stuff
  10.     mov    al,0bh        ; read in-service register from
  11.     out    0a0h,al        ; secondary 8259
  12.     nop            ; settling delay
  13.     nop
  14.     nop
  15.     in    al,0a0h        ; get it
  16.     or    al,al        ; Any bits set?
  17.     jz    notat        ; nope, not a secondary interrupt
  18.     mov    al,20h        ; Get EOI instruction
  19.     out    0a0h,al        ; Secondary 8259 (PC/AT only)
  20. notat:    mov    al,20h        ; 8259 end-of-interrupt command
  21.     out    20h,al        ; Primary 8259
  22.      pop    es
  23.     pop    di
  24.     pop    si
  25.     pop    bp
  26.     pop    dx
  27.     pop    cx
  28.     pop    bx
  29.     pop    ax
  30.     mov    ss,sssave
  31.     mov    sp,spsave    ; restore original stack context
  32.     pop    ds
  33.     iret
  34. doret    endp
  35.  
  36. ; setvect - set interrupt vector
  37. ; called from C as follows
  38. ; setvect(vec,vecval)
  39. ; char vec;        /* Interrupt number */
  40. ; void (*vecval)();    /* offset (and segment in large code model) */
  41.  
  42.     procdef    setvect,<<vec,byte>,<ipval,fptr>>
  43.     mov    cs:intds,ds    ; save data segment pointer
  44.     mov    ah,25h
  45.     mov    al,vec
  46.     mov    dx,word ptr ipval
  47.     push    ds        ; save
  48. ifdef    FARPROC
  49.     mov    ds,word ptr ipval+2
  50. else
  51.     push    cs
  52.     pop    ds
  53. endif
  54.     int    21h
  55.     pop    ds        ; restore
  56.     pret
  57.     pend    setvect
  58. intds    dw    0    ; save loc for ds (must be in code segment)
  59.  
  60. ; getintds - get ds to use during interrupt service
  61.  
  62.     public    getintds
  63.     ifdef    FARPROC
  64. getintds    proc    far
  65.     else
  66. getintds    proc    near
  67.     endif
  68.     mov    ds,cs:intds
  69.     ret
  70. getintds    endp
  71.  
  72. ; getvect - return current interrupt vector
  73. ; called from C as
  74. ; long        /* Returns CS in high word, IP in low word */
  75. ; getvect(vecnum)
  76. ; char vecnum;    /* Interrupt number */
  77.  
  78.     procdef    getvect,<<vecnum,byte>>
  79.     mov    ah,35h
  80.     mov    al,vecnum
  81.     push    es    ; save, since DOS uses it for a return value
  82.     int    21h
  83.     mov    dx,es    ; CS value into DX (C high word)
  84.     mov    ax,bx    ; IP value into AX (C low word)
  85.     pop    es    ; restore es
  86.     pret
  87.     pend    getvect
  88.  
  89. ; kbraw - raw, nonblocking read from console
  90. ; If character is ready, return it; if not, return -1
  91.  
  92.     procdef    kbraw
  93.     mov    ah,06h    ; Direct Console I/O
  94.     mov    dl,0ffh    ; Read from keyboard
  95.     int    21h    ; Call DOS
  96.     jz    nochar    ; zero flag set -> no character ready
  97.     mov    ah,0    ; valid char is 0-255
  98.     pret
  99. nochar:
  100.     mov    ax,-1    ; no char, return -1
  101.     pret
  102.     pend    kbraw
  103.  
  104. ; disable - disable interrupts and return previous state: 0 = disabled,
  105. ;           1 = enabled
  106.  
  107.     procdef    disable
  108.     pushf            ; save state on stack
  109.     cli            ; interrupts off
  110.     pop    ax        ; original flags -> ax
  111.     and    ax,200h        ; 1<<9 is IF bit
  112.     jnz    ion        ; nonzero -> interrupts were on
  113.     pret
  114. ion:    mov    ax,1
  115.     pret
  116.     pend    disable
  117.  
  118. ; restore - restore interrupt state: 0 = off, nonzero = on
  119.  
  120.     procdef    restore,<<istate,byte>>
  121.     test    istate,0ffh
  122.     jz    ioff
  123.     sti
  124. ioff:    pret
  125.     pend    restore
  126.  
  127. ; Halt until an interrupt occurs, then return
  128.     procdef eihalt
  129.     sti    ; make sure interrupts are enabled
  130.     hlt
  131.     pret
  132.     pend    eihalt
  133.  
  134. ; multitasker types
  135. NONE        equ    0
  136. DOUBLEDOS    equ    1
  137. DESQVIEW    equ    2
  138.  
  139. ; Relinquish processor so other task can run
  140.     procdef    giveup
  141.     cmp    mtasker, DOUBLEDOS
  142.     jnz    givedesqview
  143.     mov    al,2        ; 110 ms
  144.     mov    ah,0eeh
  145.     int    21h
  146.  
  147. givedesqview:
  148.     cmp    mtasker, DESQVIEW
  149.     jnz    notask
  150.     mov    ax, 1000h
  151.     int    15h
  152. notask:
  153.     pret
  154.     pend    giveup
  155.  
  156. ; check for a multitasker running
  157.     procdef chktasker
  158.     mov    mtasker, NONE
  159.     ; do the doubledos test
  160.     mov    ah, 0e4h
  161.     int    21h
  162.     cmp    al, 1
  163.     jz    isdos
  164.     cmp    al, 2
  165.     jnz    test_desq
  166. isdos:    mov    mtasker, DOUBLEDOS
  167.     pret
  168.  
  169.     ; test for desqview
  170. test_desq:
  171.     mov    ax, 2b01h
  172.     mov    cx, 4445h
  173.     mov    dx, 5351h
  174.     int    21h
  175.     cmp    al, 0ffh
  176.     jnz    isdesq
  177.     pret
  178. isdesq:    mov    mtasker, DESQVIEW
  179.     pret
  180.     pend    chktasker
  181.  
  182. ; getds - Read DS for debugging purposes
  183.     procdef    getds
  184.     push    ds
  185.     pop    ax
  186.     pret
  187.     pend    getds
  188.  
  189. ; Internet checksum subroutine
  190. ; Compute 1's-complement sum of data buffer
  191. ; Uses an unwound loop inspired by "Duff's Device" for performance
  192. ;
  193. ; Called from C as
  194. ; unsigned short
  195. ; lcsum(buf,cnt)
  196. ; unsigned short *buf;
  197. ; unsigned short cnt;
  198.     procdef    lcsum,<<buf,ptr>,<cnt,word>>
  199.     pushds            ; save if using large model
  200.     push    si
  201.     ldptr    si,buf,ds    ; ds:si = buf
  202.     mov    cx,cnt        ; cx = cnt
  203.     cld            ; autoincrement si
  204.  
  205.     mov    ax,cx
  206.     shr    cx,1        ; cx /= 16, number of loop iterations
  207.     shr    cx,1
  208.     shr    cx,1
  209.     shr    cx,1
  210.  
  211.     inc    cx        ; make fencepost adjustment for 1st pass
  212.     and    ax,15        ; ax = number of words modulo 16
  213.     shl    ax,1        ; *=2 for word table index
  214.     lea    bx,jtable    ; bx -> branch table
  215.     add    bx,ax        ; index into jump table
  216.     clc            ; initialize carry = 0
  217.     mov    dx,0        ; clear accumulated sum
  218.     jmp    word ptr[bx]    ; jump into loop
  219.  
  220. ; Here the real work gets done. The numeric labels on the lodsw instructions
  221. ; are the targets for the indirect jump we just made.
  222. ;
  223. ; Each label corresponds to a possible remainder of (count / 16), while
  224. ; the number of times around the loop is determined by the quotient.
  225. ;
  226. ; The loop iteration count in cx has been incremented by one to adjust for
  227. ; the first pass.
  228. deloop:    lodsw
  229.     adc    dx,ax
  230. l15:    lodsw
  231.     adc    dx,ax
  232. l14:    lodsw
  233.     adc    dx,ax
  234. l13:    lodsw
  235.     adc    dx,ax
  236. l12:    lodsw
  237.     adc    dx,ax
  238. l11:    lodsw
  239.     adc    dx,ax
  240. l10:    lodsw
  241.     adc    dx,ax
  242. l9:    lodsw
  243.     adc    dx,ax
  244. l8:    lodsw
  245.     adc    dx,ax
  246. l7:    lodsw
  247.     adc    dx,ax
  248. l6:    lodsw
  249.     adc    dx,ax
  250. l5:    lodsw
  251.     adc    dx,ax
  252. l4:    lodsw
  253.     adc    dx,ax
  254. l3:    lodsw
  255.     adc    dx,ax
  256. l2:    lodsw
  257.     adc    dx,ax
  258. l1:    lodsw
  259.     adc    dx,ax
  260. l0:    loop    deloop        ; :-)
  261.  
  262.     adc    dx,0        ; get last carries
  263.     adc    dx,0
  264.     mov    ax,dx        ; result into ax
  265.     xchg    al,ah        ; byte swap result (8088 is little-endian)
  266.     pop    si
  267.     popds            ; all done
  268.     pret
  269.     pend    lcsum
  270.  
  271. ;
  272. ; This routine is a generic int 21h handler, is used only by disk free
  273. ; routine.  Added by K3MC  3 Dec 87
  274. ;
  275. ;
  276. ; General-purpose int 21h caller, currently used only to return AX, BX, CX, DX
  277. ; for computing amount of free disk space, and amount of total disk space.
  278. ;
  279. ; declared as: void isfree();
  280. ;
  281. ; Called from C as:
  282. ;
  283. ; isfree(&ax,&bx,&cx,&dx)
  284. ; unsigned short ax,bx,cx,dx;
  285. ;
  286.     procdef    isfree,<<c_ax,ptr>,<c_bx,ptr>,<c_cx,ptr>,<c_dx,ptr>>
  287.     push    ax
  288.     push    bx
  289.     push    cx
  290.     push    dx
  291.     push    bp
  292.     push    si
  293.     push    di
  294.     ldptr    di,c_ax,ds
  295.     mov    ax,[di]
  296.     ldptr    di,c_bx,ds
  297.     mov    bx,[di]
  298.     ldptr    di,c_cx,ds
  299.     mov    cx,[di]
  300.     ldptr    di,c_dx,ds
  301.     mov    dx,[di]
  302.     int     21h
  303.     ldptr    di,c_ax,ds
  304.     mov    [di],ax
  305.     ldptr    di,c_bx,ds
  306.     mov    [di],bx
  307.     ldptr    di,c_cx,ds
  308.     mov    [di],cx
  309.     ldptr    di,c_dx,ds
  310.     mov    [di],dx
  311.     pop    di
  312.     pop    si
  313.     pop    bp
  314.     pop    dx
  315.     pop    cx
  316.     pop    bx
  317.     pop    ax
  318.     pret
  319.     pend    isfree
  320.  
  321.     finish
  322.  
  323.  
  324. dataseg    segment    para public 'data'
  325. jtable    dw    l0,l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12,l13,l14,l15    
  326.     bss    sssave:word,2
  327.     bss    spsave:word,2
  328.     bss    intstk:byte,512
  329.     bss    mtasker:byte,1
  330. dataseg    ends
  331.     end
  332.